<?php
/**
 *  PayController.class.php
 * ============================================================================
 * 版权所有 (C) 2015-2016 壹尚科技有限公司，并保留所有权利。
 * 网站地址:   http://www.ethank.com.cn
 * ----------------------------------------------------------------------------
 * 许可声明：这是一个开源程序，未经许可不得将本软件的整体或任何部分用于商业用途及再发布。
 * ============================================================================
 * Author: 勾国印 (gouguoyin@ethank.com.cn) 
 * Date: 2015年8月13日 下午5:13:14  
*/
namespace Home\Controller;
use Think\Controller;
class WxController extends CommonController {
    //初始化
    public function _initialize()
    {
        //引入WxPayPubHelper
        vendor('WxPayPubHelper.WxPayPubHelper');
    }
   
    public function index(){
         if (isset($_GET['id']) && isset($_GET['mac_id'])) {
          $pay_way='微信';
          $out_trade_no= $this->order_add($_GET['id'],$_GET['mac_id'],$pay_way);//传参产生订单号
            if ($out_trade_no!=0) {
                //使用统一支付接口
                $unifiedOrder = new \UnifiedOrder_pub();
                //设置统一支付接口参数
                 $goods=M('sold_goods')->where(array('out_trade_no'=>$out_trade_no))->find();
                 $total_fee=$goods['shop_good_price']*100;
                //设置必填参数
                $unifiedOrder->setParameter("body","39s即食售面机");//商品描述
                //自定义订单号，此处仅作举例
                //$unifiedOrder->SetTime_expire(date("YmdHis", time() + 60));
                $unifiedOrder->setParameter("out_trade_no","$out_trade_no");//商户订单号 
                $unifiedOrder->setParameter("total_fee",$total_fee);//总金额
                $unifiedOrder->setParameter("notify_url", 'http://www.onclick.cn/recdata/');//通知地址
				//http:yk.daniuit.com/admin/Wx/notify 
                $unifiedOrder->setParameter("trade_type","NATIVE");//交易类型
                //获取统一支付接口结果
                $unifiedOrderResult = $unifiedOrder->getResult();
        //       var_dump($unifiedOrder);
                //商户根据实际情况设置相应的处理流程
                        if ($unifiedOrderResult["return_code"] == "FAIL") 
                        {
                            //商户自行增加处理流程
                            echo "通信出错：".$unifiedOrderResult['return_msg']."<br>";
                        }
                        elseif($unifiedOrderResult["result_code"] == "FAIL")
                        {
                            //商户自行增加处理流程
                            echo "错误代码：".$unifiedOrderResult['err_code']."<br>";
                            echo "错误代码描述：".$unifiedOrderResult['err_code_des']."<br>";
                        }
                        elseif($unifiedOrderResult["code_url"] != NULL)
                        {
                            //从统一支付接口获取到code_url(二维码)
                            $code_url = $unifiedOrderResult["code_url"];
                            //商户自行增加处理流程
                             $arr=array(
                             'order'=>$out_trade_no,
                             'url'=>$code_url,
                             );
                           echo json_encode($arr);
                            exit;
                        }  
             
                         

             }else{
                 echo "";
            }
           
        }
      
      
    }
    public function notify()
    {
        //使用通用通知接口
        $notify = new \Notify_pub();
        //存储微信的回调
        $xml = $GLOBALS['HTTP_RAW_POST_DATA'];

        $notify->saveData($xml);
         
        //验证签名，并回应微信。
        //对后台通知交互时，如果微信收到商户的应答不是成功或超时，微信认为通知失败，
        //微信会通过一定的策略（如30分钟共8次）定期重新发起通知，
        //尽可能提高通知的成功率，但微信不保证通知最终能成功。
        if($notify->checkSign() == FALSE){
            $notify->setReturnParameter("return_code","FAIL");//返回状态码
            $notify->setReturnParameter("return_msg","签名失败");//返回信息
        }else{
            $notify->setReturnParameter("return_code","SUCCESS");//设置返回码
        }
        // $returnXml = $notify->returnXml();
         

        // echo json_encode($returnXml);
         
        //==商户根据实际情况设置相应的处理流程，此处仅作举例=======
         
        //以log文件形式记录回调信息
        //         $log_ = new Log_();
        $log_name= __PUBLIC__."/notify_url.log";//log文件路径
        file_put_contents($log_name, '55');
        
        // $this->log_result($log_name,"【接收到的notify通知】:\n".$xml."\n");
         
        if($notify->checkSign() == TRUE)
        {     
            if ($notify->data["return_code"] == "FAIL") {
                //此处应该更新一下订单状态，商户自行增删操作
                
                // log_result($log_name,"【通信出错】:\n".$xml."\n");
                $this->error("通信出错");
            }
            elseif($notify->data["result_code"] == "FAIL"){
                //此处应该更新一下订单状态，商户自行增删操作
            
                // log_result($log_name,"【业务出错】:\n".$xml."\n");
                $this->error("业务出错");
            }
            else{
                //此处应该更新一下订单状态，商户自行增删操作
            
                // log_result($log_name,"【支付成功】:\n".$xml."\n");
                $this->success("支付成功");
            }
          
            //商户自行增加处理流程,
            //例如：更新订单状态
            //例如：数据库操作
            //例如：推送支付完成信息
        }
    }
    //查询订单
    public function orderQuery()

    {  

    	if (!isset($_GET["out_trade_no"]) )
        {
           echo '';
        }else{
            $out_trade_no = $_GET["out_trade_no"];
           // $id=$_GET['id'];//商品id
            //使用订单查询接口
            $orderQuery = new \OrderQuery_pub();

            $orderQuery->setParameter("out_trade_no",$out_trade_no);//商户订单号 

            
            //获取订单查询结果
            $orderQueryResult = $orderQuery->getResult();
             //var_dump($orderQueryResult);
            
            //商户根据实际情况设置相应的处理流程,此处仅作举例
            if ($orderQueryResult["return_code"] == "FAIL") {

                $this->error($out_trade_no);
            }
            elseif($orderQueryResult["result_code"] == "FAIL"){
 
                $this->error($out_trade_no);
            }else{
                if($orderQueryResult["trade_state"]=='SUCCESS'){
                   $status='已支付';
                   $res=M('sold_goods')->where(array('out_trade_no'=>$out_trade_no))->find();
                   $mac_id=$res['mac_id'];
                   $chop=M('machine')->where(array('id'=>$mac_id))->find();//查询所属机台筷子情况
                   $this->order_update($status,$out_trade_no); 
                       if ($chop['row1']!=0) {
                                   $arr=array(
                                    'reply'=>0,
                                     'row'=>1,
                                     'reply_order'=>$out_trade_no
                                    );
                                echo json_encode($arr); 
                                exit; 
                        }elseif($chop['row2']!=0){
                                   $arr=array(
                                     'reply'=>0,
                                      'row'=>2,
                                      'reply_order'=>$out_trade_no
                                   );
                             echo json_encode($arr);
                             exit;  
                        }elseif ($chop['row3']!=0) {
                                   $arr=array(
                                     'reply'=>0,
                                      'row'=>3,
                                      'reply_order'=>$out_trade_no
                                   );
                             echo json_encode($arr);
                             exit;  
                        }elseif ($chop['row4']!=0) {
                                   $arr=array(
                                     'reply'=>0,
                                      'row'=>4,
                                     'reply_order'=>$out_trade_no
                                   );
                             echo json_encode($arr);
                             exit;  
                        }              
                    
                }else{

                    echo '';
                    exit;
                }
            }   
        }
    }

   // 订单退款提交
    public  function  orderRefund($out_trade_no){
          if($res=M('sold_goods')->where(array('out_trade_no'=>$out_trade_no))->find()) {
            $total_fee=$res['shop_good_price']*100;
            //$total_fee = 100;//$total_fee=$res['shop_good_price'];
            $refund_fee = $total_fee;
            $orderRefund= new \Refund_pub(); //使用订单查询接口
            $orderRefund->setParameter("out_trade_no",$out_trade_no);//商户订('')单号 
            $orderRefund->setParameter('out_refund_no',time().rand(10,100));//退款单号
            $orderRefund->setParameter('total_fee',$total_fee);//总金额
            $orderRefund->setParameter('refund_fee',$refund_fee);//退款总金额
            $orderRefund->setParameter('op_user_id','1991222');//操作员
            $orderRefundResult = $orderRefund->getResult();//获取订单查询结果
            //商户根据实际情况设置相应的处理流程,此处仅作举例
            if ($orderRefundResult["return_code"] == "FAIL") {
                $this->error($out_trade_no);
            }elseif($orderRefundResult["return_code"] == "SUCCESS"){
                  $status='已退款';
                $this->order_update($status,$out_trade_no);                 
            }    
         }
    }




    // 机台出货结果
    public function result(){
        file_put_contents('./log.txt', $_GET['code'],FILE_APPEND);
                 $out_trade_no=$_GET['out_trade_no'];
                $res=M('sold_goods')->where(array('out_trade_no'=>$out_trade_no))->find();
                $mac_id=$res['mac_id'];//所属机台id
                if ($_GET['code']==0) {
                   M('sold_goods')->where(array('out_trade_no'=> $out_trade_no))->save(array('out_status'=>'已出货'));
                   $chop=M('machine')->where(array('id'=>$mac_id))->find();//查询所属机台筷子情况
                   M('machine')->where(array('id'=>$mac_id))->setDec('material',1);//商品库存减1
                   M('machine')->where(array('id'=>$mac_id))->setDec('paper_cup',1);//纸碗库存减1
                       if ($chop['row1']!=0){
                             M('machine')->where(array('id'=>$mac_id))->setDec('row1',1);//筷子对应货道库存减1
                             exit;
                        }elseif($chop['row2']!=0){
                             M('machine')->where(array('id'=>$mac_id))->setDec('row2',1);//筷子对应货道库存减1
                        }elseif ($chop['row3']!=0) {
                          M('machine')->where(array('id'=>$mac_id))->setDec('row3',1);//筷子对应货道库存减1
                             exit;  
                        }elseif ($chop['row4']!=0) {
                           M('machine')->where(array('id'=>$mac_id))->setDec('row4',1);//筷子对应货道库存减1
                             exit;  
                        }              
                }else{
                  M('machine')->where(array('id'=>$mac_id))->save(array('status'=>1));
                  $this->orderRefund($out_trade_no);
                }   
     }

    //打印支付结果
      function printf_info($data)
       {
    foreach($data as $key  =>  $value){
        echo "<font color='#00ff55;'>$key</font> : $value <br/>";
       }
     }
     //核对刷卡结果
	 public function checkshuaka(){
		$getData = $_GET['d'];
		echo $getData;
		
		//把收到的数据分配到变量中
		$jsres = json_decode($getData,true);
		var_dump($jsres);
		//主要三个变量必须同时存在，否则退出
		if(!(array_key_exists('msgid',$jsres) && array_key_exists('act',$jsres) 
			&& array_key_exists('var',$jsres))){echo "e0";exit;}
		
		foreach($jsres as $name=>$value){
			$$name = $value;
		}
		//如果$var是数组型，则拆分
		if(is_array($var)){
			if(!(array_key_exists('sessionid',$var) && array_key_exists('out_trade_no',$var))){echo "e1";exit;}
			foreach($var as $name=>$value){
			//	echo $name,"~",$value,"<br>";
				$$name = $value;
			}
			//确认接收到的数据是准确的
			if(!((strlen($msgid)>0) && (strlen($act)>0))){echo 'arr data loss';echo "e2";exit;}
		}else{
			exit;
		}
		$input = new \WxPayMicroPay();
		//$auth_code='134780128810271292';
		//$input->SetAuth_code($auth_code);
		//$input->SetBody("赛威实业-微信支付");
		//$input->SetTotal_fee("1");
		//$input->SetOut_trade_no(\WxPayConf_pub::MCHID.date("YmdHis"));
		$input->SetOut_trade_no($out_trade_no);//这里是把REQUEST来的otn写入，自带
		$input->inputSign($insign1);//这是我自己写的函数，注入sign，没有自带
		
		$microPay = new \MicroPay();
		var_dump($input);
		$thisPayRes = $microPay->checkpay($input);//这里执行checkpay，也是我自己写的函数
		echo "<",$thisPayRes,">";
		//$data['res']=json_encode($thisPayRes);
	 }
     //刷卡支付
       public function  shuaka(){
            //if(isset($_REQUEST["auth_code"]) && $_REQUEST["auth_code"] != ""){
             // vendor('WxPayPubHelper.WxPay.MicroPay');
				$getData = $_POST['d'];
				
				//把收到的数据分配到变量中
				$jsres = json_decode($getData,true);
				//主要三个变量必须同时存在，否则退出
				if(!(array_key_exists('msgid',$jsres) && array_key_exists('act',$jsres) 
					&& array_key_exists('var',$jsres))){exit;}
				
				foreach($jsres as $name=>$value){
					$$name = $value;
				}
				//如果$var是数组型，则拆分
				if(is_array($var)){
					if(!(array_key_exists('sessionid',$var) && array_key_exists('auth_code',$var))){exit;}
					foreach($var as $name=>$value){
					//	echo $name,"~",$value,"<br>";
						$$name = $value;
					}
					//确认接收到的数据是准确的
					if(!((strlen($msgid)>0) && (strlen($act)>0))){echo 'arr data loss';exit;}
				}else{
					exit;
				}
                //$auth_code = $_POST["auth_code"];
                $input = new \WxPayMicroPay();
                //$auth_code='134780128810271292';
                $input->SetAuth_code($auth_code);
                $input->SetBody("赛威实业-微信支付");
                $input->SetTotal_fee("1");
                $input->SetOut_trade_no(\WxPayConf_pub::MCHID.date("YmdHis"));
                
                $microPay = new \MicroPay();
				//var_dump($input);
                $thisPayRes = $microPay->pay($input);
			    $data['res']=json_encode($thisPayRes);
				$data['updatet']=time();
				//var_dump($data);
				//var_dump($thisPayRes);
				M('sw_wxres')->add($data);
			  	if($_POST['ExtMsg'] == '1'){
               		$this->printf_info($thisPayRes);
					echo 'DATA~';
			 	}
				if(is_array($thisPayRes)){
					echo '{"msgid":"',$msgid,'","act":"WP","result":"A","var":"PAY_SUCC"}';
				}else{
					echo '{"msgid":"',$msgid,'","act":"WP","result":"R","var":"PAY_FAIL"}';
				}

            //}
       }
  
}
   

?>